package com.xj.algorithm.leetcode;

/**
 * 验证回文串
 *
 * 跳过其他符号，忽略大小写
 */
public class L125_回文字符串 {

    /**
     *给定一个字符串，验证它是否是回文串，只考虑字母和数字字符，可以忽略字母的大小写。
     *
     * 说明：本题中，我们将空字符串定义为有效的回文串。
     *
     * 示例 1:
     *
     * 输入: "A man, a plan, a canal: Panama"
     * 输出: true
     * 示例 2:
     *
     * 输入: "race a car"
     * 输出: false
     */
    public static void main(String[] args) {
        String param="A man, a plan, a canal: Panama";
        System.out.println(isPalindromeOffice(param));

        String param2="race a car";
        System.out.println(isPalindromeOffice(param2));

        String param3="0P";
        System.out.println(isPalindromeOffice(param3));
    }

    //自己的解法：头尾指针。
    public static boolean isPalindrome(String s) {
        int head=0,tail=s.length()-1;
        while (head<=tail){
            char headChar=s.charAt(head);
            if(headChar<'0' || (headChar>'9' && headChar<'A') ||
                    (headChar>'Z' && headChar<'a') || (headChar>'z')){
                head++;
                continue;
            }

            char tailChar=s.charAt(tail);
            if(tailChar<'0' || (tailChar>'9' && tailChar<'A') ||
                    (tailChar>'Z' && tailChar<'a') || (tailChar>'z')){
                tail--;
                continue;
            }

            if(headChar>='A' && tailChar>='A' && headChar!=tailChar && Math.abs(headChar-tailChar)!=32){
                return false;
            }

            if(headChar<='9' && tailChar<='9' && headChar!=tailChar){
                return false;
            }

            if(headChar>='A' && tailChar<='9'){
                return false;
            }

            if(headChar<='9' && tailChar>='A'){
                return false;
            }

            head++;
            tail--;
        }
        return true;
    }

    //官方解法：使用了库函数。全部转化为小写就不用减法了
    public static boolean isPalindromeOffice(String s) {
        int i = 0, j = s.length() - 1;
        while(i < j){
            while(i < j && !Character.isLetterOrDigit(s.charAt(i))) i++;
            while(i < j && !Character.isLetterOrDigit(s.charAt(j))) j--;
            if(Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(j))) return false;
            i++; j--;
        }
        return true;
    }

}
